import random
import re
print("欢迎使用中国工商银行账户管理系统！")
print("**************************")
print("*       中国工商银行       *")
print("*       账户管理系统       *")
print("*          v1.0          *")
print("**************************")
print("* 1.开户                  *")
print("* 2.存钱                  *")
print("* 3.取钱                  *")
print("* 4.转账                  *")
print("* 5.查询                  *")
print("* 6.Bye!                 *")
print("**************************")
information = [{"账号": 12345678, "姓名": "王岳恒", "密码": 123456, "地址": {"国家": "中国", "省份": "河南省", "地址": "郑州市高新区中鸿花园", "门牌号": "303"}, "存款余额": 100, "开户银行": "中国工商银行"},
               {"账号": 12345679, "姓名": "王五", "密码": 123456, "地址": {"国家": "中国", "省份": "河南省", "地址": "郑州市高新区中鸿花园", "门牌号": "303"}, "存款余额": 0, "开户银行": "中国工商银行"}]
while True:
    num = input("请选择功能1-6：")
    if num == "1":
        while True:
            name = input("请输入姓名（需为2-4个中文字符）：")
            # 正则表达式：^ 表示开头，$ 表示结尾，[\u4e00-\u9fa5] 匹配任意中文字符，{2,4} 限制长度为2-4
            if re.fullmatch(r'^[\u4e00-\u9fa5]{2,4}$', name):
                print(f"姓名输入正确：{name}")
                break
            else:
                print("姓名格式错误！请输入2-4个中文字符（不含字母、数字、符号等）")
        while True:
            try:
                # 先获取字符串输入，再判断是否为数字
                password_str = input("请设置密码（6位数字）：")
                # 校验是否全为数字
                if not password_str.isdigit():
                    print("密码必须是纯数字，请重新输入")
                    continue
                # 校验位数是否为6位
                if len(password_str) != 6:
                    print("密码必须是6位数字，请重新输入")
                    continue
                # 所有校验通过，转换为整数（如需存储数字类型）
                password = int(password_str)
                print("密码设置成功！")
                break  # 仅在成功时退出循环
            except Exception as e:
                # 理论上上述校验已覆盖所有错误，此处仅作为兜底
                print(f"输入错误：{e}，请重新设置")

        while True:
            try:
                # 1. 获取用户输入并转换为字典
                input_str = input("请输入地址（格式：{国家:xxx, 省份:xxx, 地址:xxx, 门牌号:xxx}，值需为字符串）：")
                # 去除输入中的空格（避免用户输入时的空格干扰，如 {国家: 中国} 中的空格）
                input_str = input_str.replace(" ", "")
                # 使用 eval 转换为字典（注意：仅在可信环境下使用，若有安全顾虑可改用 json，但需严格双引号格式）
                address = eval(input_str)

                # 2. 校验是否为字典类型
                if not isinstance(address, dict):
                    raise TypeError("输入必须是字典类型")

                # 3. 校验是否包含所有必填键
                required_keys = ["国家", "省份", "地址", "门牌号"]
                missing_keys = [key for key in required_keys if key not in address]
                if missing_keys:
                    raise KeyError(f"缺少必填键：{missing_keys}，请补充")

                # 4. 校验所有值是否为字符串类型
                for key, value in address.items():
                    if not isinstance(value, str):
                        raise TypeError(f"键 '{key}' 的值必须是字符串，当前类型：{type(value).__name__}")

                else:
                    print("地址设置成功！")
                    break  # 若只需添加一个地址，可退出循环；若需持续添加，可移除此行
            except Exception as e:
                print(f"输入错误：{str(e)}，请重新输入")
        money = 0
        bank = "中国工商银行"
        account = ""
        for i in range(8):
            account += str(random.randint(1, 9))
        exist = None
        for i in information:
            if i["账号"] == account:
                exist = account
        if exist == account:
            print(2)
            print("用户已存在")
            break
        if len(information) == 2:
            print(3)
            print("用户库已满")
            break
        else:
            print(1)
            information.append({"账号": account, "姓名": name, "密码": password, "地址": address, "存款余额": money, "开户银行": bank})
            print("开户成功！")
    if num == "2":
        username = input("请输入姓名：")
        passwd = int(input("请输入密码："))
        for i in information:
            if i["姓名"] != username:
                print("用户名不存在")
            if i["密码"] != passwd:
                print("密码错误")
            else:
                addmoney  = int(input("请输入要存入的金额："))
                i["存款余额"] += addmoney
                print("存入成功！")
    if num == "3":
        username = input("请输入姓名：")
        passwd = int(input("请输入密码："))
        for i in information:
            if i["姓名"] != username:
                print(1)
                print("用户名不存在")
            if i["密码"] != passwd:
                print(2)
                print("密码错误")
            else:
                reducemoney  = int(input("请输入要取出的金额："))
                if i["存款余额"] > reducemoney:
                    i["存款余额"] -= reducemoney
                    print("取钱成功！")
                else:
                    print(3)
                    print("存款不足，取钱失败")
                    break
    if num == "4":
        while True:
            try:
                root = int(input("请输入转出的账号（输入0返回）："))
                if root == 0:
                    break  # 退出转账功能

                passwd = int(input("请输入密码："))
                crossroot = int(input("请输入转入账号："))

                # 查找转出账户
                sender = None
                for acc in information:
                    if acc["账号"] == root:
                        sender = acc
                        break

                if sender is None:
                    print("转出账号不存在")
                    continue

                # 验证密码
                if sender["密码"] != passwd:
                    print("密码错误")
                    continue

                # 查找转入账户
                receiver = None
                for acc in information:
                    if acc["账号"] == crossroot:
                        receiver = acc
                        break

                if receiver is None:
                    print("转入账号不存在")
                    continue

                # 处理转账
                try:
                    reducemoney = int(input("请输入要转出的金额："))
                    if reducemoney <= 0:
                        print("金额必须为正数")
                        continue

                    if sender["存款余额"] >= reducemoney:
                        sender["存款余额"] -= reducemoney
                        receiver["存款余额"] += reducemoney
                        print("转账成功！")
                        break  # 完成转账后退出循环
                    else:
                        print("存款不足，转账失败")
                except ValueError:
                    print("请输入有效的金额")

            except ValueError:
                print("请输入有效的数字账号")
    if num == "5":
        username = input("请输入姓名：")
        passwd = int(input("请输入密码："))
        for i in information:
            if i["姓名"] != username:
                print("用户名不存在")
            if i["密码"] != passwd:
                print("密码错误")
            else:
                print(i)
                print("查询成功！")
    if num == "6":
        print("系统退出成功")
        break

